[genre].tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import clsx from "clsx";
  2. import Link from "next/link";
  3. import { useContext } from "react";
  4. import { useRouter } from "next/router";
  5. import { GetServerSideProps } from "next";
  6. import { Context } from "../../libs/context";
  7. import useGet from "../../utils/hooks/useGet";
  8. import type { ListItem } from "../../types/http";
  9. import NovelItem from "../../components/NovelItem";
  10. import styles from "../../styles/genre.module.scss";
  11. const Genre = () => {
  12. const { query } = useRouter();
  13. const { data } = useGet<ListItem[]>(
  14. query.genre ? `/api/genre/${query.genre}` : "/api/list"
  15. );
  16. const store = useContext(Context);
  17. return (
  18. <main className="container">
  19. <h2 className="novel-title">Genres</h2>
  20. <div className={styles.genres}>
  21. <Link
  22. href="/novels"
  23. title="All novels"
  24. className={clsx(styles.genre, {
  25. [styles.current]: !query.genre,
  26. })}
  27. >
  28. All
  29. </Link>
  30. {store.genre.map((item) => (
  31. <Link
  32. href={`/novels/${item.uri}`}
  33. key={item.uri}
  34. title={item.name}
  35. className={clsx(styles.genre, {
  36. [styles.current]: query.genre === item.uri,
  37. })}
  38. >
  39. {item.name}
  40. </Link>
  41. ))}
  42. </div>
  43. <h2 className="novel-title">List</h2>
  44. <ul className="novel-list">
  45. {(data?.data || []).map((item) => (
  46. <NovelItem
  47. key={item.uri}
  48. slug={item.uri}
  49. img={item.img}
  50. name={item.name}
  51. />
  52. ))}
  53. </ul>
  54. </main>
  55. );
  56. };
  57. export const getServerSideProps: GetServerSideProps<
  58. { fallback: { [key: string]: any } },
  59. { genre: string }
  60. > = async ({ params }) => {
  61. const key = params?.genre ? `/api/genre/${params.genre}` : `/api/list`;
  62. const data = await fetch(key).then((res) => res.json());
  63. return {
  64. props: {
  65. fallback: {
  66. [key]: data,
  67. },
  68. },
  69. };
  70. };
  71. export default Genre;